package com.googlecode.mastercrud.bc.simple;

import java.io.Serializable;

import com.googlecode.mastercrud.bc.GenericBC;
import com.googlecode.mastercrud.exceptions.BCException;
import com.googlecode.mastercrud.exceptions.DAOException;
import com.googlecode.mastercrud.persistence.Criterias;
import com.googlecode.mastercrud.persistence.GenericDAO;
import com.googlecode.mastercrud.persistence.Result;

abstract public class SimpleBC<E> implements GenericBC<E> {

	@Override
	public Result<E> list() throws BCException {
		return this.list(new Criterias());
	}

	@Override
	public void delete(E entidade) throws BCException {
		try {
			getDao().delete(entidade);
		} catch (DAOException e) {
			throw new BCException(e);
		}
	}

	@Override
	public void insert(E entidade) throws BCException {
		try {
			getDao().insert(entidade);
		} catch (DAOException e) {
			throw new BCException(e);
		}		
	}

	@Override
	public Result<E> list(Criterias criteria) throws BCException {
		try {
			return getDao().list(criteria);
		} catch (DAOException e) {
			throw new BCException(e);
		}
	}

	@Override
	public Result<E> listByCriteria(Criterias criteria) throws BCException {
		try {
			return getDao().listByCriteria(criteria);
		} catch (DAOException e) {
			throw new BCException(e);
		}
	}

	@Override
	public Result<E> listByExample(E entidade, Criterias criteria) throws BCException {
		try {
			return getDao().listByExample(entidade, criteria);
		} catch (DAOException e) {
			throw new BCException(e);
		}
	}

	@Override
	public E load(Serializable id) throws BCException {
		try {
			return getDao().load(id);
		} catch (DAOException e) {
			throw new BCException(e);
		}
	}

	@Override
	public void save(E entidade) throws BCException {
		try {
			getDao().save(entidade);
		} catch (DAOException e) {
			throw new BCException(e);
		}
	}

	@Override
	public void update(E entidade) throws BCException {
		try {
			getDao().update(entidade);
		} catch (DAOException e) {
			throw new BCException(e);
		}
	}

	public abstract GenericDAO<E> getDao();

}